

package futbol.tacticas.concursantes2007.AlfArgentin;


import futbol.tacticas.*;
import java.awt.*;
import java.awt.geom.*;
import java.util.Hashtable;
import java.util.Iterator;


/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Licencia GPL</p>
 *
 * <p>Company: </p>
 * @author Alfredo Garcia Woods
 * @version 1.0
 */
public class Defensa implements IJugador{
    double posicionFijaX;
    double posicionFijaY;

    final double rangoDemovimiento=90;

    int yoJugador=0;

    double minX;
    double maxX;
    double minY;
    double maxY;

    //el key es el jugador que marca y el value es elmarcado
    public static Hashtable tablaJugadoresMarcados = new  Hashtable();  //Modificado por Jorge Rubira. He puesto publico este Hashtable y ser reseteado cada vez que inicie un partido.


    /**
     *
     *
     * @param num int
     * @param posicionFijaX double
     * @param posicionFijaY double
     */
    public Defensa(int num,double posicionFijaX,double posicionFijaY) {
        yoJugador=num;
        this.posicionFijaX=posicionFijaX;
        this.posicionFijaY=posicionFijaY;


        minX=posicionFijaX - rangoDemovimiento;
        maxX=posicionFijaX + rangoDemovimiento;
        minY=posicionFijaY - rangoDemovimiento;
        maxY=posicionFijaY + rangoDemovimiento;
    }


    /**
     * getjugador
     *
     * @return int
     */
    public int getjugador(){
        return yoJugador;
    }


    /**
     * getComandoMovimiento
     *
     * @param sj SituacionJugadores
     * @return Comando
     */
    public Comando getComandoMovimiento(SituacionJugadores sj){

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();

        if(sj.getMasCercanoDeBola()==yoJugador){// si soy el que estoy mas cerca directamente voy a la pelota
            return new  ComandoIrA(yoJugador, bola.getX(), bola.getY());
        }
        //siempre y cuando la pelota este de media cancha para abajo
        if( bola.getX()<20 ){
            //si no soy el mas cercano pero esta de media cancha para abajo me pongo a marcar el jugador mas cercano
            int jug=sj.getContrarioMasCerca(yoJugador);

            //1ero veo si ese jugador ya est marcado
            Iterator iter= tablaJugadoresMarcados.values().iterator();
            while(iter.hasNext()) {
                Integer intMarcado = (Integer) iter.next();
                if(jug==intMarcado.intValue() ){// si est marcado
                    Object o=  tablaJugadoresMarcados.get(new Integer(yoJugador));
                    if(o == null ){// y no soy yo quien lo marca, entonces me voy a la posicion fija
                        return  irAPosicionFija();
                    }

                }
            }



            Point contrarioCerca=  contrarios[jug];
            double incX=0;
            double incY=0;


            if(bola.getX() > jugadores[yoJugador].getX()){// si la pelota esta adelante lo marco desde adelante
                incX=15;
            }
              if(bola.getX() < jugadores[yoJugador].getX()){// si la pelota esta adelante lo marco desde adelante
                incX=-15;
            }

               if(bola.getY() > jugadores[yoJugador].getY()){// si la pelota esta adelante lo marco desde adelante
                incY=15;
            }
              if(bola.getY() < jugadores[yoJugador].getY()){// si la pelota esta adelante lo marco desde adelante
                incY=-15;
            }

                Point2D.Double punto=  movimientoDentroDelCarril(contrarioCerca.getX()+incX, contrarioCerca.getY()+incY);// le sumo 2 para ganarle la aposicion
                tablaJugadoresMarcados.put(new Integer(yoJugador),new Integer(jug) );
                return new ComandoIrA(yoJugador, punto.getX(), punto.getY());

        }
        return irAPosicionFija();
    }



    private Comando  irAPosicionFija(){
        tablaJugadoresMarcados.remove(new Integer(yoJugador));// si no marca a nadie se borra de la tabla de marcaciones
        return new  ComandoIrA(yoJugador, posicionFijaX, posicionFijaY);
    }


    /**
     * movimientoDentroDelCarril
     *
     * @param x double
     * @param y double
     * @return Double
     */
    public Point2D.Double movimientoDentroDelCarril(double x, double y){
        Point2D.Double punto=new Point2D.Double();
        //si est dentro del carril devuelve la posicion pedida
        if((x<maxX && x>minX) &&
                (y<maxY && y>minY)){
            punto.x=x;
            punto.y=y;
            return punto;
        }

        punto.x=posicionFijaX ;
        punto.y=posicionFijaY;
        return punto;

    }


    /**
     * getComandoTiro
     *
     * @param sj SituacionJugadores
     * @return Comando
     */
    public Comando getComandoTiro(SituacionJugadores sj){
     int arquero=0;

        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();

         Point miPosicion=jugadores[yoJugador];

        Point bola=sj.getBola();

        if(bola.getX()>40){
         return   new ComandoTiroAPuerta(yoJugador,20);
        }else{
             if(miPosicion.getY()<0){
                return new ComandoGolpearBola(yoJugador,165,-20);
            }else{
                return new ComandoGolpearBola(yoJugador,165,20);
            }

        }
    }
}
